﻿#define _CRT_SECURE_NO_WARNINGS 1
//函数的讲解


//问题？？？？
//调试
// 数组名=数组首元素地址=取地址写数组名=解指针变量

////返回值？
//函数不接受任何参数？
//数据类型及大小？
//字符和整型和字符串
//\n的tips
//指针


//取地址&取首地址还是所有地址？
//arr是首地址还是所有地址，还是都有？使用场景？
//数组作为函数参数传递






//库函数
////pow次方
//#include<stdio.h>//printf 输入输出头文件
//#include<math.h>//pow需要包含头文件
//int main()
//{
//	int a = (int)pow(4, 3);//次方计算返回值是浮点型所以我们需要强制转化
//	double b = pow(4.0, 3.0);
//	printf("%d %.f", a, b);
//	return 0;
//}


//
////strcpy
//#include<stdio.h>
//#include<string.h>
//int main()
//{
//	char arr1[20] = "aaaaaaaaaaaaaaa";
//	char arr2[] = "hello  C" ;
//    printf("%s\n", strcpy(arr1, arr2) );//strcpy返回是目标值arr1的起始地址
//	//*起始地址=数组元素
//	printf("%s\n", *arr1);
//	return 0;
//}



////memset
//#include<stdio.h>
//#include<string.h>
//int main()
//{
//	char arr[10] = "Hello, X";
//	memset(arr, 'h', 5);
//	printf("%s", arr);
//	return 0;
//}



//自定义函数
//void print()
//{
//	printf("hehe");
//}
//#include<stdio.h>
//int main()
//{
//	print();
//	return 0;
//}
//


//不需要参数和返回值
//void print()
//{
//	printf("hehe");
//}
//#include<stdio.h>
//int main()
//{
// print();
//return 0;
//}


////写一个函数可以找出两个整数中的最大值
//int get_max(int x, int y)
//{
//	if (x > y)
//		return x;
//	else
//		return y;
//}
//#include<stdio.h>
//int main()
//{
//	int a = 0;
//	int b = 0;
//	scanf("%d %d", &a, &b);
//	int s = get_max(a,b);//函数调用
//	printf("%d", s);
//	return 0;
//}







//写一个函数可以交换两个整形变量的内容。
//传参数
//x和y是形式参数
//void Swap(int x, int y)
//{
//	int z = x;
//	x = y;
//	y = z;
//}
//#include<stdio.h>
//int main()
//{
//	int a = 0;
//	int b = 0;
//	scanf("%d %d", &a, &b);
//	printf("a=%d b=%d\n", a, b);
//	//a和b的是实际参数
//	//函数调用的时候，将实参传递给了形参
//	//形参实际上是实参的一份临时拷贝
//	//对形参的修改，不会改变实参
//	Swap(a, b);
//	printf("a=%d b=%d\n", a, b);
//	return 0;
//}

//void Swap(int* x, int* y)//地址需要指针变量来接受
//{
//	int z = *x;//*x是解地址操作符
//	*x = *y;
//	*y = z;
//}
//#include<stdio.h>
//int main()
//{
//	int a = 0;
//	int b = 0;
//	scanf("%d %d", &a, &b);
//	printf("a=%d b=%d\n", a, b);
//	Swap(&a,&b);
//	printf("a=%d b=%d\n", a, b);
//	return 0;
//}


//形式参数和实际参数
//void get(int* x, int* y)
//{
//	//
//}
//#include<stdio.h>
//int main()
//{
//	int* p1;
//	int* p2;
//	get(p1,p2);//传值调用
//	return 0;
//}


//练习
//1. 写一个函数可以判断一个数是不是素数。
// 素数在整数正数范围内研究
//奇数
//实除到根号b
//#include<math.h>
//#include<stdio.h>
//int main()
//{
//	int x = 0;
//	int y = 0;
//	scanf("%d", &x);
//	int flag = 0;
//	for (x = 2; y < sqrt(x); y++)//包含的是3以上的数字
//	{
//			if (x % y == 0)//是素数
//			{
//				flag = 1;
//				break;
//			}
//	}
//	if ((flag == 0) || (x == 1))
//			printf("是素数");
//	return 0;
//}


//函数
//打印100~200的素数
//#include<stdio.h>
//#include<math.h>
//#include<stdbool.h>
//_Bool is_prime(int x)
//{
//	int j = 0;
//	for (j = 2; j <= sqrt(x); j++)
//	{
//		if (x % j == 0)//不是素数
//			return false;//0
//	}
//			return true;//0
//}
//int main()
//{
//	int i = 0;
//	//打印100~200之间的奇数
//	for (i = 101; i <= 200; i += 2)//奇数条件
//	{
//		if(is_prime(i));//判断是否是素数
//		//为真就执行，为假不执行
//		printf("%d ",i);
//	}
//	return 0;
//}












//2. 写一个函数判断一年是不是闰年。
// 判断闰年条件
// 1.能被4整除，不能被100整除是闰年
// 2.能被400整除是闰年

//#include<stdio.h>
//#include<stdbool.h>
//_Bool is_leap_year(int x)
//{
//	if ((x % 4 == 0 && x % 100 != 0) || x % 400 == 0)
//		return true;
//	else
//		return false;
//}
//int main()
//{
//	int i = 0;
//	int count = 0;
//	for (i = 1000; i <= 2000; i++)
//	{
//		if (is_leap_year(i))
//		{
//			printf("%d ", i);
//			count++;
//		}
//	}
//	printf("\n%d", count);
//		return 0;
//}
//#include<stdio.h>
//#include<stdbool.h>
//_Bool is_leap_year(int x)
//{
//	return ((x % 4 == 0 && x % 100 != 0) || x % 400 == 0);
//}
//int main()
//{
//	int i = 0;
//	int count = 0;
//	for (i = 1000; i <= 2000; i++)
//	{
//		if (is_leap_year(i))
//		{
//			printf("%d ", i);
//			count++;
//		}
//	}
//	printf("\n%d", count);
//	return 0;
//}





//3. 写一个函数，实现一个整形有序数组的二分查找。

//#include<stdio.h>
// void binary_search(int arr[],int i)
//{
//	int left = 0;
//	int size = sizeof(arr) / sizeof(arr[0]);//错误❌
//	int right = size - 1;
//	int flag = 0;
//	while (left <= right)
//	{
//		int mid = (left + right) / 2;
//		if (arr[mid] < i)
//		{
//			//right不变
//			left = mid + 1;
//		}
//		else if (arr[mid] > i)
//		{
//			//left不变
//			right = mid - 1;
//		}
//		else
//		{
//			printf("找到了，下标是：%d\n", mid);
//			flag = 1;
//			break;
//		}
//	}
//	if(flag == 0)
//	printf("没找到");
//}
//
//int main()
//{
//	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
//	int i = 0;
//	scanf("%d", &i);
//	//实现二分查找
//	binary_search(arr,i);	
//	return 0;
//}














//
//#include<stdio.h>
//int binary_search(int arr[], int i)
//{
//	int left = 0;
//	int size = sizeof(arr) / sizeof(arr[0]);//❌
//	int right = size - 1;
//	while (left <= right)
//	{
//		int mid = (left + right) / 2;
//		if (arr[mid] < i)
//		{
//			//right不变
//			left = mid + 1;
//		}
//		else if (arr[mid] > i)
//		{
//			//left不变
//			right = mid - 1;
//		}
//		else
//		{
//			return mid;
//		}
//	}
//	return -1;
//}
//
//int main()
//{
//	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
//	int i = 0;
//	scanf("%d", &i);
//	int ret = binary_search(arr, i);
//	if (ret == -1)
//		printf("没找到");
//	else
//		printf("找到了，下标是：%d\n", ret);
//
//	return 0;
//}
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
////
//#include<stdio.h>
//int binary_search(int arr[], int i, int size)
//{
//	int left = 0;
//	int right = size - 1;
//	while (left <= right)
//	{
//		//int mid=(left+right)/2;
//		int mid = left+(right-left)/2;
//		if (arr[mid] < i)
//		{
//			//right不变
//			left = mid + 1;
//		}
//		else if (arr[mid] > i)
//		{
//			//left不变
//			right = mid - 1;
//		}
//		else
//		{
//			return mid;
//		}
//	}
//	return -1;
//}
//
//int main()
//{
//	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
//	int i = 0;
//	scanf("%d", &i);
//	int size = sizeof(arr) / sizeof(arr[0]);
//	//实现二分查找
//	int ret = binary_search(arr, i, size);
//	if (ret == -1)
//		printf("没找到");
//	else
//		printf("找到了，下标是：%d\n", ret);
//
//	return 0;
//}

//#include<stdio.h>
//int main()
//{
//	int right =2147483746;//int容忍最大值2147483747
//	int left = 2147483746;
//	int mid = (right + left) / 2;
//	printf("%d", mid);
//	return 0;
//}


//4. 写一个函数，每调用一次这个函数，就会将num的值增加1
//#include<stdio.h>
//int Add(int num)
//{
//	return  num + 1;
//}
//int main()
//{
//	int num = 0;
//	num=Add(num);
//	printf("%d", num);
//	return 0;
//}

//#include<stdio.h>
//void Add(int* num)
//{
//	*num = *num + 1;
//}
//int main()
//{
//	int num = 0;
//	Add(&num);
//	printf("%d", num);
//	return 0;
//}

























//函数的嵌套调用
//#include <stdio.h>
//void new_line()
//{
//	printf("hehe\n");
//}
//void three_line()
//{
//	int i = 0;
//	for (i = 0; i < 3; i++)
//	{
//		new_line();
//	}
//}
//int main()
//{
//	three_line();
//	return 0;
//}
//
////嵌套定义❌
//void test()
//{
//	int Add(int a, int b)
//	{
//		return a + b;
//	}
//}
//#include<stdio.h>
//int main()
//{
//	return 0;
//}


//函数链接
//#include <stdio.h>
//#include <string.h>
//int main()
//{
//	char arr[20] = "hello";
//	char ch[10] = {0};
//	int ret = strlen(strcat(arr, "bit"));//库函数查询的strcat函数
//	printf("%d\n", ret);
//	printf("%d\n", strlen(strcpy(ch,arr)));
//	return 0;
//}


//#include <stdio.h>
//int main()
//{
//	printf("%d", printf("%d", printf("%d", 43)));
//	//结果是啥？
//	return 0;
//}




//#include<stdio.h>
//int Add(int num1, int num2);//函数声明
//int main()
//{
//	int num1 = 0;
//	int num2 = 0;
//	scanf("%d %d", &num1, &num2);
//	int ret=Add(num1, num2);//函数调用
//	printf("%d", ret);
//	return 0;
//}
//int Add(int num1, int num2)//函数定义
//{
//	return (num1 + num2);
//}



//
//#include<stdio.h>
//int Add(int num1, int num2)//函数定义本身就是一种特殊的声明
//{
//	return (num1 + num2);
//}
//
//int main()
//{
//	int num1 = 0;
//	int num2 = 0;
//	scanf("%d %d", &num1, &num2);
//	int ret = Add(num1, num2);//函数调用
//	printf("%d", ret);
//	return 0;
//}
